/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;


import connection.AbstractConnection;
import entidades.Artista;
import entidades.Categoria;
import entidades.Gravadora;
import entidades.Produto;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 *
 * @author Ricardo
 */
public class ProdutoDAO extends AbstractDAO {

    final String sqlFindById =
            "select p.idproduto,p.categoria_idcategoria,p.gravadora_idgravadora,p.artista_id,p.titulo,p.valor_venda,p.ano,p.n_trilhas,p.descricao,p.data_lancamento from produto p where p.idproduto=?;";
    final String sqlDelete =
            "delete from produto where id=?";
    final String sqlInsert =
            "insert into produto (idproduto,categoria_idcategoria,gravadora_idgravadora,artista_id,titulo,valor_venda,ano,n_trilhas,descricao,data_lancamento) values (?,?,?,?,?,?,?,?,?,?)";

    public ProdutoDAO(AbstractConnection conn) {
        super(conn);
    }

    public Produto getProdutoById(int id) throws SQLException {
        return getProduto(sqlFindById, new Integer(id));
    }

    public Produto getProduto(String sql, Object whatFind) throws SQLException {
        Produto res = null;

        PreparedStatement ps =
                conn.getConnection().prepareStatement(sql);

        if (whatFind instanceof String) {
            ps.setString(1, (String) whatFind);
        } else if (whatFind instanceof Integer) {
            ps.setInt(1, (Integer) whatFind);
        }

        ResultSet rs = ps.executeQuery();

        if (rs == null) {
            return null;
        }

        while (rs.next()) {
            res = preencheProduto(rs);
        }

        conn.closeConnection();

        return res;

    }

    private Produto preencheProduto(ResultSet rs) throws SQLException {
        Produto produto = new Produto();
        TrilhaDAO trilhaDAO = new TrilhaDAO(getNewConnection());

        produto.setId(rs.getInt("idproduto"));
        produto.setTitulo(rs.getString("titulo"));
        produto.setValorVenda(rs.getFloat("valor_venda"));
        produto.setAno(rs.getInt("ano"));
        produto.setNumeroTrilhas(rs.getInt("n_trilhas"));
        produto.setDescricao(rs.getString("descricao"));
        produto.setDataLancamento(rs.getDate("data_lancamento"));
        produto.setCategoria(getCategoria(rs.getInt("categoria_idcategoria")));
        produto.setArtista(getArtista(rs.getInt("artista_id")));
        produto.setGravadora(getGravadora(rs.getInt("gravadora_idgravadora")));
        trilhaDAO.insertTrilha(produto.getTrilhas(), produto);

        return produto;
    }

    private Categoria getCategoria(int id) throws SQLException {
        return (new ArtistaCategoriaGravadoraDAO(getNewConnection())).getCategoriaById(id);
    }

    private Artista getArtista(int id) throws SQLException {
        return (new ArtistaCategoriaGravadoraDAO(getNewConnection())).getArtistaById(id);
    }

    private Gravadora getGravadora(int id) throws SQLException {
        return (new ArtistaCategoriaGravadoraDAO(getNewConnection())).getGravadoraById(id);
    }

    public void remove(Produto produto) throws SQLException {
        if (getProdutoById(produto.getId()) != null) {
            PreparedStatement ps = conn.getConnection().prepareStatement(sqlDelete);
            ps.executeQuery();
            conn.closeConnection();
        }
    }

    public void insertUpdate(Produto produto) throws SQLException {
        int aux;
        remove(produto);
        PreparedStatement ps = conn.getConnection().prepareStatement(sqlInsert);

        if (produto.getId() == 0) { // inserção
            ps.setInt(1, getNextId("produto", "idproduto"));
        } else {
            ps.setInt(1, produto.getId());
        }
        ps.setString(4, produto.getTitulo());
        ps.setFloat(5, new Float(produto.getValorVenda()));
        ps.setInt(6, produto.getAno());
        ps.setInt(7, produto.getNumeroTrilhas());
        ps.setString(8, produto.getDescricao());
        ps.setDate(9, new java.sql.Date(produto.getDataLancamento().getTime()));

        ArtistaCategoriaGravadoraDAO acg = new ArtistaCategoriaGravadoraDAO(getNewConnection());
        if ((aux = isInList(acg.getAllCategoria(), produto.getCategoria().getCategoria())) != -1) {
            ps.setInt(2, aux);
        }
        if ((aux = isInList(acg.getAllGravadora(), produto.getGravadora().getNome())) != -1) {
            ps.setInt(3, aux);
        }
        if ((aux = isInList(acg.getAllArtista(), produto.getArtista().getNome())) != -1) {
            ps.setInt(4, aux);
        }

        ps.executeQuery();
        conn.closeConnection();
    }

    private int isInList(List<?> itens, String nome) throws SQLException {
        int id = -1;
        for (Object o : itens) {
            String value = null;

            if (o instanceof Artista) {
                value = ((Artista) o).getNome();
                id = ((Artista) o).getId();
            } else if (o instanceof Gravadora) {
                value = ((Gravadora) o).getNome();
                id = ((Gravadora) o).getId();
            } else if (o instanceof Categoria) {
                value = ((Categoria) o).getCategoria();
                id = ((Categoria) o).getId();
            }

            if (value.equals(nome)) {
                return id;
            }
        }
        return id;
    }
}
